﻿using System;
using System.Linq;
using System.Threading.Tasks;
using Serilog;
using Windows.ApplicationModel.Background;
using Wino.Core.Domain.Interfaces;

namespace Wino.Core.UWP.Services;

public class BackgroundTaskService : IBackgroundTaskService
{
    private const string IsBackgroundTasksUnregisteredKey = nameof(IsBackgroundTasksUnregisteredKey);
    public const string ToastNotificationActivationHandlerTaskName = "ToastNotificationActivationHandlerTask";

    private readonly IConfigurationService _configurationService;

    public BackgroundTaskService(IConfigurationService configurationService)
    {
        _configurationService = configurationService;
    }

    public void UnregisterAllBackgroundTask()
    {
        if (_configurationService.Get(IsBackgroundTasksUnregisteredKey, false))
        {
            foreach (var task in BackgroundTaskRegistration.AllTasks)
            {
                task.Value.Unregister(true);
            }

            Log.Information("Unregistered all background tasks.");
            _configurationService.Set(IsBackgroundTasksUnregisteredKey, true);
        }
    }

    public Task RegisterBackgroundTasksAsync()
    {
        return RegisterToastNotificationHandlerBackgroundTaskAsync();
    }

    public async Task RegisterToastNotificationHandlerBackgroundTaskAsync()
    {
        // If background task is already registered, do nothing.
        if (BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals(ToastNotificationActivationHandlerTaskName)))
            return;

        // Otherwise request access
        BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

        // Create the background task
        BackgroundTaskBuilder builder = new BackgroundTaskBuilder()
        {
            Name = ToastNotificationActivationHandlerTaskName
        };

        // Assign the toast action trigger
        builder.SetTrigger(new ToastNotificationActionTrigger());

        // And register the task
        BackgroundTaskRegistration registration = builder.Register();
    }
}
